package base;

import java.awt.*;
import java.util.ArrayList;
import javax.swing.*;

public class Square extends JPanel {

	// Toa do Square
	private int xPos;
	private int yPos;

	// Chi so Square theo các hàng
	private int letterIndexAcross = 0;
	private int letterIndexDown = 0;
	private int letterIndexBias1 = 0;
	private int letterIndexBias2 = 0;
	/*---------------------------------*/
	private int wordIndex; // Số thứ tự nếu có
	/*---------------------------------*/
	private JLabel labelLetter = null; // Hiển thị độ dài ô chữ
	private JLabel labelIndex = null; // Hiển thị số thứ tự ô chữ

	/*----------------------------*/
	private Word wordAcross = null; // Các từ đi qua Square
	private Word wordDown = null;
	private Word wordBias1 = null;
	private Word wordBias2 = null;

	/*--------------------------*/
	private Box vertBox; // Box hiển thị Square
	private Box indexBox; // Box chứa số thứ tự
	private Box letterBox; // Box chứa chữ cái

	private Color resetColour; // màu ban đầu

	private boolean isBlank; // Kiểm tra Square có trống không
	private int changeDirection = 0; // Kiểm tra đổi hướng
	private boolean isHint = false; // Kiểm tra Square đã bật gợi ý chưa

	/*********************** Khởi tạo ********************************************/

	public Square() {
	}

	public Square(int xPos, int yPos, Color c) {
		super();
		isBlank = true;
		this.xPos = xPos;
		this.yPos = yPos;
		setBackground(c);
		setLayout(new BorderLayout());

		changeDirection = 0;

		/* Chi so Font Arial BOLD kich thuoc 10 */
		labelIndex = new JLabel();
		labelIndex.setText(" ");

		labelLetter = new JLabel();
		labelLetter.setAlignmentX(0f);
		labelLetter.setAlignmentY(0f);

		indexBox = Box.createHorizontalBox();

		indexBox.setPreferredSize(new Dimension(10, 10));
		indexBox.setMinimumSize(new Dimension(10, 10));
		indexBox.setMaximumSize(new Dimension(15, 10));
		indexBox.add(labelIndex);

		letterBox = Box.createHorizontalBox();
		letterBox.setPreferredSize(new Dimension(20, 20));

		indexBox.add(labelIndex);
		letterBox.add(labelLetter);

		vertBox = Box.createVerticalBox();

		vertBox.add(indexBox);
		vertBox.add(letterBox);

		add(vertBox, BorderLayout.CENTER);
	}

	// gạch chéo khi hiện gợi ý
//	@Override
//	public void paintComponent(Graphics g) {
//		super.paintComponent(g);
//		if (isHint) {
//			super.paintComponent(g);
//			Graphics2D g2 = (Graphics2D) g;
//			g2.setPaint(Color.BLUE);
//			g2.setStroke(new BasicStroke(1));
//			g2.drawLine(0, this.getHeight() / 2, this.getWidth() / 2, this
//					.getHeight());
//
//		}
//	}

	// Làm trống Square
	public void blank() {
		indexBox.remove(labelIndex);
		indexBox.setBorder(null);
		letterBox.remove(labelLetter);
		labelLetter.setText(" ");
		isBlank = true;
	}

	/******************************* Set và Get các thuộc tính **************************/

	// Tọa độ
	public int getXPos() {
		return xPos;
	}

	public int getYPos() {
		return yPos;
	}

	// isBlank
	public void setIsBlank(boolean b) {
		isBlank = b;
	}

	public boolean getIsBlank() {
		return isBlank;
	}

	public void setIsHint(boolean b) {
		isHint = b;
	}

	public boolean getIsHint() {
		return isHint;
	}

	// WordIndex
	public void setWordIndex(int i) {
		if (i < 10)
			labelIndex.setText(" " + String.valueOf(i));
		else
			labelIndex.setText(String.valueOf(i));
		labelIndex.setForeground(Color.black);
		labelIndex.setFont(new Font("Arial", Font.PLAIN, 9));
		indexBox.add(labelIndex);
		indexBox.setBorder(BorderFactory.createLineBorder(Color.BLUE, 1));
		wordIndex = i;
	}

	public int getWordIndex() {
		return wordIndex;
	}

	// WordLength
	public void setWordLength(int i) {
		if (i < 10 && i > 0)
			labelIndex.setText(" " + String.valueOf(i));
		else if (i >= 10)
			labelIndex.setText(String.valueOf(i));
		else
			labelIndex.setText("");
		labelIndex.setFont(new Font("Arial", Font.BOLD, 10));
		labelIndex.setForeground(Color.blue);
		indexBox.add(labelIndex);
	}

	// Letter
	public void setLetter(String s) {
		labelLetter.setText(s.toUpperCase());
		letterBox.add(labelLetter);
		isBlank = false;
		validate();
	}

	public String getLetter() {
		return labelLetter.getText();
	}

	// ResetColour
	public Color getResetColour() {
		return resetColour;
	}

	public void setResetColour(Color c) {
		resetColour = c;
	}

	// Font
	public void setFontSize(int i) {
		labelLetter.setFont(new Font("Arial", Font.BOLD, i));
	}

	// LetterIndex
	public void setLetterIndexBias1(int i) {
		letterIndexBias1 = i;
	}

	public void setLetterIndexBias2(int i) {
		letterIndexBias2 = i;
	}

	public void setLetterIndexAcross(int i) {
		letterIndexAcross = i;
	}

	public void setLetterIndexDown(int i) {
		letterIndexDown = i;
	}

	public int getLetterIndexAcross() {
		return letterIndexAcross;
	}

	public int getLetterIndexDown() {
		return letterIndexDown;
	}

	public int getLetterIndexBias1() {
		return letterIndexBias1;
	}

	public int getLetterIndexBias2() {
		return letterIndexBias2;
	}

	// Word
	public void setWordDown(Word w) {
		wordDown = w;
	}

	public void setWordAcross(Word w) {
		wordAcross = w;
	}

	public void setWordBias1(Word w) {
		wordBias1 = w;
	}

	public void setWordBias2(Word w) {
		wordBias2 = w;
	}

	public Word getWordBias1() {
		return wordBias1;
	}

	public Word getWordBias2() {
		return wordBias2;
	}

	public Word getWordAcross() {
		return wordAcross;
	}

	public Word getWordDown() {
		return wordDown;
	}

	/*********************** Các phưong thức khác ******************************/

	// Đặt Square ở trạng thái không có từ nào đi qua
	public void setNoWord() {
		wordAcross = null;
		wordDown = null;
		wordBias1 = null;
		wordBias2 = null;
	}

	// Bỏ từ đi qua Square theo hướng
	public void setWordNull(int i) {
		if (!isBlank) {
			if (i == Word.DOWN)
				wordDown = null;
			else if (i == Word.ACROSS)
				wordAcross = null;
			else if (i == Word.BIAS1)
				wordBias1 = null;
			else if (i == Word.BIAS2)
				wordBias2 = null;

		}
	}

	// Set từ đi qua Square theo hướng
	public void setWord(Word w) {
		if (w.getWordDirection() == Word.DOWN)
			wordDown = w;
		else if (w.getWordDirection() == Word.ACROSS)
			wordAcross = w;
		else if (w.getWordDirection() == Word.BIAS1)
			wordBias1 = w;
		else if (w.getWordDirection() == Word.BIAS2)
			wordBias2 = w;
	}

	// Lấy từ đi qua Square theo hướng
	public Word getWord(int i) {
		if (!isBlank) {
			if (i == Word.DOWN) {
				return wordDown;
			} else if (i == Word.ACROSS)
				return wordAcross;
			else if (i == Word.BIAS1)
				return wordBias1;
			else if (i == Word.BIAS2)
				return wordBias2;
		}
		return null;
	}

	// Lấy từ đi qua Square với biến changeDirection có tác dụng đổi hướng
	public Word getWord() {
		{
			if (changeDirection == 0) {
				changeDirection = 1;
				if (wordDown != null)
					return wordDown;
				else if (wordAcross != null)
					return wordAcross;
				else if (wordBias1 != null)
					return wordBias1;
				else if (wordBias2 != null)
					return wordBias2;

			} else if (changeDirection == 1) {
				changeDirection = 2;
				if (wordBias2 != null)
					return wordBias2;
				else if (wordBias1 != null)
					return wordBias1;
				else if (wordAcross != null)
					return wordAcross;
				else if (wordDown != null)
					return wordDown;

			} else if (changeDirection == 2) {
				changeDirection = 3;
				if (wordBias1 != null)
					return wordBias1;
				else if (wordDown != null)
					return wordDown;
				else if (wordBias2 != null)
					return wordBias2;
				else if (wordAcross != null)
					return wordAcross;
			} else if (changeDirection == 3) {
				changeDirection = 0;
				if (wordAcross != null)
					return wordAcross;
				else if (wordBias2 != null)
					return wordBias2;
				else if (wordBias1 != null)
					return wordBias1;
				else if (wordDown != null)
					return wordDown;
			}

		}
		return null;
	}

	// Lấy toàn bộ từ đi qua Square
	public ArrayList getAllWords() {
		ArrayList al = new ArrayList(4);
		if (wordDown != null)
			al.add(wordDown);
		if (wordBias1 != null)
			al.add(wordBias1);
		if (wordBias2 != null)
			al.add(wordBias2);
		if (wordAcross != null)
			al.add(wordAcross);

		return al;
	}

	// kiểm tra xem có từ nào đi qua Square đang được lựa chọn không
	public boolean isAnyWordSelected() {
		if (wordAcross != null) {
			if (wordAcross.getIsSelected())
				return true;
		}
		if (wordDown != null) {
			if (wordDown.getIsSelected())
				return true;
		}
		if (wordBias1 != null) {
			if (wordBias1.getIsSelected())
				return true;
		}
		if (wordBias2 != null) {
			if (wordBias2.getIsSelected())
				return true;
		}
		return false;
	}
}
